home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / Synth / LFO.C < prev    next >
C/C++ Source or Header  |  2005-03-14  |  4KB  |  142 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   LFO.C - LFO implementation
  5.   Copyright (C) 2002-2005 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22.  
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <math.h>
  26.  
  27. #include "LFO.h"
  28.  
  29.  
  30. LFO::LFO(LFOParams *lfopars,REALTYPE basefreq){
  31.     if (lfopars->Pstretch==0) lfopars->Pstretch=1;
  32.     REALTYPE lfostretch=pow(basefreq/440.0,(lfopars->Pstretch-64.0)/63.0);//max 2x/octave
  33.  
  34.     REALTYPE lfofreq=(pow(2,lfopars->Pfreq*10.0)-1.0)/12.0*lfostretch;
  35.     incx=fabs(lfofreq)*(REALTYPE)SOUND_BUFFER_SIZE/(REALTYPE)SAMPLE_RATE;
  36.  
  37.     if (lfopars->Pcontinous==0){
  38.     if (lfopars->Pstartphase==0) x=RND;
  39.     else x=fmod((lfopars->Pstartphase-64.0)/127.0+1.0,1.0);
  40.     } else {
  41.     REALTYPE tmp=fmod(lfopars->time*incx,1.0);
  42.     x=fmod((lfopars->Pstartphase-64.0)/127.0+1.0+tmp,1.0);
  43.     };
  44.  
  45.     //Limit the Frequency(or else...)
  46.     if (incx>0.49999999) incx=0.499999999;
  47.     
  48.  
  49.     lfornd=lfopars->Prandomness/127.0;
  50.     if (lfornd<0.0) lfornd=0.0; else if (lfornd>1.0) lfornd=1.0;
  51.  
  52. //    lfofreqrnd=pow(lfopars->Pfreqrand/127.0,2.0)*2.0*4.0;
  53.     lfofreqrnd=pow(lfopars->Pfreqrand/127.0,2.0)*4.0;
  54.  
  55.     switch (lfopars->fel){
  56.     case 1:lfointensity=lfopars->Pintensity/127.0;break;
  57.     case 2:lfointensity=lfopars->Pintensity/127.0*4.0;break;//in octave
  58.     default:lfointensity=pow(2,lfopars->Pintensity/127.0*11.0)-1.0;//in centi
  59.         x-=0.25;//chance the starting phase
  60.         break;
  61.     };
  62.  
  63.     amp1=(1-lfornd)+lfornd*RND;
  64.     amp2=(1-lfornd)+lfornd*RND;
  65.     lfotype=lfopars->PLFOtype;
  66.     lfodelay=lfopars->Pdelay/127.0*4.0;//0..4 sec
  67.     incrnd=nextincrnd=1.0;
  68.     freqrndenabled=(lfopars->Pfreqrand!=0);
  69.     computenextincrnd();
  70.     computenextincrnd();//twice because I want incrnd & nextincrnd to be random
  71. };
  72.  
  73. LFO::~LFO(){
  74. };
  75.  
  76. /*
  77.  * LFO out
  78.  */
  79. REALTYPE LFO::lfoout(){
  80.     REALTYPE out;    
  81.     switch (lfotype){
  82.     case 1: //LFO_TRIANGLE
  83.         if ((x>=0.0)&&(x<0.25)) out=4.0*x;
  84.         else if ((x>0.25)&&(x<0.75)) out=2-4*x;
  85.              else out=4.0*x-4.0;
  86.         break;
  87.     case 2: //LFO_SQUARE
  88.         if (x<0.5) out=-1; 
  89.             else   out=1;
  90.         break;
  91.     case 3: //LFO_RAMPUP
  92.         out=(x-0.5)*2.0;
  93.         break;
  94.     case 4: //LFO_RAMPDOWN
  95.         out=(0.5-x)*2.0;
  96.         break;
  97.     case 5: //LFO_EXP_DOWN 1
  98.         out=pow(0.05,x)*2.0-1.0;
  99.         break;
  100.     case 6: //LFO_EXP_DOWN 2
  101.         out=pow(0.001,x)*2.0-1.0;
  102.         break;
  103.     default:out=cos(x*2.0*PI);//LFO_SINE
  104.     };
  105.  
  106.  
  107.     if ((lfotype==0)||(lfotype==1)) out*=lfointensity*(amp1+x*(amp2-amp1));
  108.         else out*=lfointensity*amp2;
  109.     if (lfodelay<0.00001) {
  110.         if (freqrndenabled==0) x+=incx;
  111.         else x+=incx*(incrnd*(1.0-x)+nextincrnd*x);
  112.         if (x>=1) {
  113.         x=fmod(x,1.0);
  114.         amp1=amp2;
  115.         amp2=(1-lfornd)+lfornd*RND;
  116.  
  117.         computenextincrnd();
  118.         };
  119.     } else lfodelay-=(REALTYPE)SOUND_BUFFER_SIZE/(REALTYPE)SAMPLE_RATE;
  120.     return(out);
  121. };
  122.  
  123. /*
  124.  * LFO out (for amplitude)
  125.  */
  126. REALTYPE LFO::amplfoout(){
  127.     REALTYPE out;
  128.     out=1.0-lfointensity+lfoout();
  129.     if (out<-1.0) out=-1.0;
  130.     else if (out>1.0) out=1.0;
  131.     return(out);
  132. };
  133.  
  134.  
  135. void LFO::computenextincrnd(){
  136.     if (freqrndenabled==0) return;
  137.     incrnd=nextincrnd;
  138.     nextincrnd=pow(0.5,lfofreqrnd)+RND*(pow(2.0,lfofreqrnd)-1.0);
  139.     if (nextincrnd*incx>=0.49999999) nextincrnd=1.0;
  140. };
  141.  
  142.